package com.hxh.generater.springBoot.genBase;

import com.hxh.entity.Project;
import lombok.extern.slf4j.Slf4j;

/**
 * @ProjectName: AICode
 * @Package: com.hxh.generater.springBoot.genBase
 * @ClassName: InitProject
 * @Author: HXH
 * @Description: 项目的创建流程，后续使用不同的模板生成代码时，需要继承本类
 * 通过反射,动态调用
 * @Date: 2024/5/21 9:41
 */
@Slf4j
public abstract class InitBaseProject {
    /**
     * @return void
     * @author HXH
     * @description: 初始化数据库相关
     * @date 2024/5/21
     **/
    public abstract void initDatabaseData(Project project) throws Exception;

    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 初始化菜单相关
     * @date 2024/5/21
     **/
    public abstract void initMenu(Project project) throws Exception;


    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 初始化缓存相关
     * @date 2024/5/21
     **/
    public abstract void initCache(Project project) throws Exception;

    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 登录/权限相关
     * @date 2024/5/21
     **/
    public abstract void initLoginAndPermissions(Project project) throws Exception;

    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 系统日志相关
     * @date 2024/5/21
     **/
    public abstract void initSystemLog(Project project) throws Exception;

    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 初始化工具类
     * @date 2024/5/21
     **/
    public abstract void initSystemUtils(Project project) throws Exception;


    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 初始化系统配置类 如跨域等
     * @date 2024/5/21
     **/
    public abstract void initSystemConfig(Project project) throws Exception;

    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 初始化系统基础代码，如pom.xml，application、yml等
     * @date 2024/5/21
     **/
    public abstract void initSystemBase(Project project) throws Exception;

    /**
     * @param project         :
     * @param initExtendTable  :是否创建用户自定义表的crud
     * @return void
     * @author HXH
     * @description:
     * @date 2024/5/21 创建数据库中所有表的crud
     **/
    public abstract void initAllTableCRUD(Project project, boolean initExtendTable) throws Exception;

    /**
     * 不同模板特有的东西，如果有需要可以添加实现
     *
     * @param project
     */
    public abstract void initCustom(Project project) throws Exception;


    /**
     * @param project:
     * @return void
     * @author HXH
     * @description: 必须要创建的核心代码、定义创建的流程 通过反射, 动态调用
     * @date 2024/5/21
     **/
    public void initCore(Project project, Boolean initExtendTable) throws Exception {
        //数据库相关
        initDatabaseData(project);
        //初始化菜单相关
        initMenu(project);
        //初始化缓存相关
        initCache(project);
        //登录/权限相关
        initLoginAndPermissions(project);
        //系统日志相关
        initSystemLog(project);
        //初始化工具类
        initSystemUtils(project);
        //初始化系统配置类 如跨域等
        initSystemConfig(project);
        //初始化系统基础代码
        initSystemBase(project);

        initAllTableCRUD(project, initExtendTable);

        initCustom(project);
        initAddition(project);

    }

    /**
     * @return void
     * @author HXH
     * @description: 可选组件
     * @date 2024/5/21
     **/
    public abstract void initAddition(Project project) throws Exception;
}
